package com.wanghua.spring.filter.gzip;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
* Filter中 实现 GZIP 压缩。
* 网站常使用GZIP压缩算法对网页内容进行压缩，然后传给浏览器，以减小数据传输量。目前主流浏览器等都支持GZIP自动解压。
* Apach等服务器也有GZIP压缩功能。
* 压缩 Filter 中需要先判断客户浏览器是否支持 GZIP 自动解压，如果支持，则进入 GZIP 压缩。判断依据是浏览器提供的 Header 信息。
* */
public class GZipFilter implements Filter {

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        String acceptEncoding = request.getHeader("Accept-Encoding");
        System.out.println("Accept-Encoding: " + acceptEncoding);

        if (acceptEncoding != null && acceptEncoding.toLowerCase().indexOf("gzip") != -1) {
            GZipResponseWrapper gzipResponse = new GZipResponseWrapper(response);  //若浏览器支持 gzip 编码，则使用 gzip 压缩数据
            chain.doFilter(request, gzipResponse); //第二个参数是自定义的 Response
            gzipResponse.finishResponse();
        } else {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
    }
}